package json

import (
	"encoding/json"
	"fmt"
)

//首先查找tag含有Foo的可导出的struct字段(首字母大写)
//其次查找字段名是Foo的导出字段
//最后查找类似FOO或者FoO这样的除了首字母之外其他大小写不敏感的导出字段
type student struct {
	Name string `json:"-"` //不会被序列化也不会被反序列化
	age int
	Teacher teacher
	Flag bool `json:"beautiful"`
	Address string `json:",omitempty"`  //添加了tag omitempty， 序列化时如果为空会被忽略，对比参看Blog
	Blog string
}

type teacher struct {
	Name string
}

func Play(){
	input := `{"name":"jy","age":3, "beautiful": true, "teacher":{"name":"good teacher"}}`

	//反序列化
	var student student
	json.Unmarshal([]byte(input), &student)
	fmt.Println(student.Teacher.Name)
	//大写字母开头的属性才会被反序列化
	fmt.Println(student.age)
	fmt.Println(student.Name)
	fmt.Println(student.Flag)

	//序列化
	str, ok := json.Marshal(student)
	if ok == nil {
		fmt.Println(string(str))
	}

	//动态解析
	var result interface{}
	json.Unmarshal([]byte(input), &result)
	r, pp := result.(map[string]interface{}) //interface 断言
	if !pp {
		fmt.Println("not map")
		return
	}
	for k, v := range r{
		fmt.Println(k, v)
	}
}


